#ifndef __Contact
#define __Contact

#include "ClefPublique.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gmp.h>
#include <glib-2.0/glib.h>

struct sContact
{
    char Nom[20];
    char Prenom[20];
    char Mail[40];
    ClefPublique *pClefPublique;
};

typedef struct sContact Contact;


/** @brief Renvoie le champ Nom de la structure Contact */
char * contactGetNom(Contact *pContact);

/** @brief Renvoie le champ Nom de la structure Contact en interdisant toutes modifications */
const char * contactGetNom2(const Contact *pContact);

/** @brief Modifie le champ Nom de la structure Contact*/
void contactSetNom(Contact *pContact, const char* Nom);

/** @brief Renvoie le champ Prenom de la structure Contact */
char * contactGetPrenom(Contact *pContact);

/** @brief Renvoie le champ Prenom de la structure Contact en interdisant toutes modifications */
const char * contactGetPrenom2(const Contact *pContact);

/** @brief Modifie le champ Prenom de la structure Contact */
void contactSetPrenom(Contact *pContact, const char* Prenom);

/** @brief Renvoie le champ Mail de la structure Contact */
char * contactGetMail(Contact *pContact);

/** @brief Renvoie le champ Mail de la structure Contact en interdisant toutes modifications */
const char * contactGetMail2(const Contact *pContact);

/** @brief Modifie le champ Mail de la structure Contact */
void contactSetMail(Contact *pContact, const char* Mail);

/** @brief Renvoie le champ Clef de la structure Contact */
ClefPublique* contactGetClefPublique(Contact *pContact);

/** @brief Renvoie le champ Clef de la structure Contact en interdisant toutes modifications */
const ClefPublique* contactGetClefPublique2(const Contact *pContact);

/** @brief Modifie le champ Clef de la structure Contact */
void contactSetClefPublique(Contact *pContact, const mpz_t n1, const mpz_t c1);

/** @brief Compare deux contacts selon leur nom par rapport à l'ordre alphabétique*/
int contactComparer(gconstpointer c1, gconstpointer c2);

/** @brief Initialise une structure contact*/
void contactInitialiser(Contact** pContact);

/** @brief Libère une structure contact*/
void contactLiberer(Contact* pContact);

/** @brief Remplit les champs d'une structure contact (mode texte)*/
void contactSaisir(Contact* pContact);

/** @brief Affiche les champs d'une structure contact (mode texte)*/
void contactAfficher(const Contact* pContact);

/** @brief Test le module contact*/
void testRegressionContact();

#endif
